//
//  TableViewEditViewController.m
//  UITableViewDemo
//
//  Created by LZXuan on 15-5-18.
//  Copyright (c) 2015年 轩哥. All rights reserved.
//

#import "TableViewEditViewController.h"

#import "UserModel.h"
#define kScreenSize [UIScreen mainScreen].bounds.size

@interface TableViewEditViewController () <UITableViewDataSource,UITableViewDelegate>
{
    //表格视图
    UITableView *_tableView;
    //数据源数组
    NSMutableArray *_dataArr;
}
@property (nonatomic,retain) UITableView *tableView;
@end

@implementation TableViewEditViewController
- (void)dealloc {
    [_dataArr release];
    self.tableView = nil;
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [self creatTableView];

    [self dataInit];
}
#pragma mark - 数据
- (void)dataInit {
    _dataArr = [[NSMutableArray alloc] init];
    
    //创建 26 个一维 数组 把26个数组 放入_dataArr指向的对象
    //每个区分对应一个一维数组
    //每个cell 的数据 是一个整体（学生信息），这个时候我们应该 把这个学生信息封装一个类 (数据模型类) 每个cell 上面的数据 就是一个数据模型对象
    //这时我们就应该 把数据模型对象地址放入对应26个一维数组中
    
    for (NSInteger i = 0; i < 26; i++) {
        //一维数组
        NSMutableArray *arr = [[NSMutableArray alloc] init];
        for (NSInteger j = 0; j < 10 ; j++) {
            //一维数组的内容 应该是10个UserModel 对象
            UserModel *model = [[UserModel alloc] init];
            model.name = [NSString stringWithFormat:@"%C%ld",(unichar)('A'+i),j];
            model.phoneNumber = [NSString stringWithFormat:@"%u",arc4random()];
            model.sexStr = @"man";
            
            model.headName = [NSString stringWithFormat:@"%04u.jpg",arc4random()%24+33];
            //把模型对象放入数组中
            [arr addObject:model];
            [model release];
        }
        
        //把一维数组放入数据源
        [_dataArr addObject:arr];
        [arr release];
    }
    
    //有了数据之后 刷新表格
    [self.tableView reloadData];
}

#pragma mark - 创建表格
- (void)creatTableView {
    //取消导航条影响
    self.automaticallyAdjustsScrollViewInsets = NO;
    
    self.tableView = [[[UITableView alloc] initWithFrame:CGRectMake(0, 64, kScreenSize.width, kScreenSize.height-64) style:UITableViewStylePlain] autorelease];
    //设置代理和数据源
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    
    //打开系统的编辑按钮
    //每个视图控制器默认自带一个编辑按钮
    self.navigationItem.rightBarButtonItem = self.editButtonItem;
    
    
    //一旦把TableView粘贴到view 那么就可以立即执行协议的方法
    [self.view addSubview:self.tableView];
}

#pragma mark - UITableView协议
//有多少分区
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return _dataArr.count;
}
//每个分区有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    return [_dataArr[section] count];
}
//cell 显示之前 获取cell
//每次显示cell 都会调用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellId = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if (!cell) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId] autorelease];
    }
    //获取 数据源中数据模型对象
    UserModel *model = _dataArr[indexPath.section][indexPath.row];
    //填充cell  把数据模型的内容显示到cell 上
    
    cell.textLabel.text = model.name;
    cell.detailTextLabel.text = model.phoneNumber;
    cell.imageView.image = [UIImage imageNamed:model.headName];
    
    return cell;
}
//设置 分区 头标
// A B C D...
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [NSString stringWithFormat:@"%C",(unichar)('A'+section)];
}

#pragma mark - TableView的编辑
//1.打开整个TableView编辑状态
//UIViewController 自带的编辑按钮 会触发
//子类重写之后 可以控制
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    //先调用父类
    [super setEditing:editing animated:animated];
    //通过编辑按钮 控制整个TableView的编辑状态
    
    /*
    if (self.tableView.editing) {
        //判断点击按钮时的编辑状态
        [self.tableView setEditing:NO animated:YES];
    }else {
        [self.tableView setEditing:YES animated:YES];
    }*/
    [self.tableView setEditing:!self.tableView.editing animated:YES];
    
}
//只要对TableView的cell 进行 增 删 移动 都需要先打开 TableView的编辑

//2.控制 TableView对 指定cell 的编辑
#pragma mark - 实现 关于编辑的协议方法
//2.1 指定cell 是否可以编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    //第3分区不能编辑
    if (indexPath.section == 3) {
        return NO;
    }
    return YES;
}
//2.2设置指定分区指定行的cell 的编辑类型
/*
 UITableViewCellEditingStyleNone,0 //不编辑
 UITableViewCellEditingStyleDelete, 1//删除
 UITableViewCellEditingStyleInsert 2//增加
 */
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    //奇数行 删除 偶数行 增加
    if (indexPath.row%2 == 0) {
        //偶数
        return UITableViewCellEditingStyleInsert;
    }else {
        return UITableViewCellEditingStyleDelete;
    }
}
//2.3 处理 增加 删除编辑操作
//当点击 删除 /增加cell 按钮的时候调用
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    //传入 编辑的类型
    //判断 编辑类型
    switch (editingStyle) {
            //编辑的时候要时刻保证 TableView界面上的数据和数据源数组中的数据保持同步 、一致
        case UITableViewCellEditingStyleDelete:
        {
            //删除
            //先从数据源数组中删除指定的数据
            NSMutableArray *arr = _dataArr[indexPath.section];
            //删除指定索引
            [arr removeObjectAtIndex:indexPath.row];
            
            //数据源 一旦变化 必须要刷新表格 ,保持同步
            
#if 0
            //刷新表格  整个表格
            //reloadData 会把 协议中的三个方法 1.多少分区2.分区有多少行3.创建显示cell 重新调用
            [self.tableView reloadData];
            
#elif 0
       //2.第二种刷新 刷新指定分区
            NSIndexSet *set = [NSIndexSet indexSetWithIndex:indexPath.section];
            //带动画效果
            [self.tableView reloadSections:set withRowAnimation:UITableViewRowAnimationFade];
            
#else
            //3.tableView自带的删除 cell 的方法
            //下面的动画效果 不明显 (ios7之后 就这样了)
            [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];
            
#endif
  
        }
            break;
        case UITableViewCellEditingStyleInsert:
        {
            //增加
            UserModel *model = [[UserModel alloc] init];
            model.name = @"小红";
            model.phoneNumber = @"12345678";
            model.headName = @"0033.jpg";
            
            //插入到数据源数组
            [_dataArr[indexPath.section] insertObject:model atIndex:indexPath.row];
            [model release];
            
            //刷新表格
            
#if 0
            //刷新表格  整个表格
            //reloadData 会把 协议中的三个方法 1.多少分区2.分区有多少行3.创建显示cell 重新调用
            [self.tableView reloadData];
            
#elif 0
            //2.第二种刷新 刷新指定分区
            NSIndexSet *set = [NSIndexSet indexSetWithIndex:indexPath.section];
            //带动画效果
            [self.tableView reloadSections:set withRowAnimation:UITableViewRowAnimationFade];
            
#else
            //3.TableView自带增加 cell
            [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];
            
            
#endif
            
            
        }
            break;
            
        default:
            break;
    }
    
}

//更改删除编辑时候的标题
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
    return @"删除";
}





@end
